package com.uzai.console.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uzai.common.entity.WechatUser;
import com.uzai.console.dto.user.wechatuser.UpdateDefaultClient;
import com.uzai.console.dto.user.wechatuser.UpdateDefaultClientPersonal;
import com.uzai.console.dto.user.wechatuser.WechatUserQuery;
import com.uzai.console.vo.user.wechatuser.MinMaxCreateTimeVo;
import com.uzai.console.vo.user.wechatuser.WechatUserSimpleVo;
import com.uzai.console.vo.user.wechatuser.WechatUserTotalVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;

@Repository
public interface WechatUserMapper {
    int deleteById(@Param("id") Long id, @Param("merId") Long merId);

    int deleteByBizUserId(@Param("bizUserId") String bizUserId, @Param("merId") Long merId);

    int insert(WechatUser record);

    WechatUser selectById(@Param("id") Long id, @Param("merId") Long merId);

    WechatUser selectByBizUserId(@Param("bizUserId") String bizUserId, @Param("merId") Long merId);

    WechatUser selectByUzaiUnionId(@Param("uzaiUnionId") String uzaiUnionId, @Param("merId") Long merId);

    int updateById(WechatUser record);

    int updateByIdSelective(WechatUser record);

    /**
     * 批量替换机器人信息
     * @param merId
     * @return
     */
    int batchUpdateDeviceInfo(@Param("oldDeviceUniqueId") Long oldDeviceUniqueId, @Param("newDeviceUniqueId") Long newDeviceUniqueId, @Param("merId") Long merId);

    /**
     * 批量替换旧机器人固定身份的机器人信息
     * @param oldDeviceUniqueId 旧机器人id
     * @param identity 身份
     * @param newDeviceUniqueId 新机器人id
     * @param newUserType 新的会员类型
     * @param merId
     * @return
     */
    int batchUpdateDeviceInfoByIdentity(@Param("oldDeviceUniqueId") Long oldDeviceUniqueId, @Param("identity") Integer identity, @Param("newDeviceUniqueId") Long newDeviceUniqueId, @Param("newUserType") Long newUserType, @Param("merId") Long merId);

    /**
     * 分页查询
     * @param page
     * @param query
     * @return
     */
    ArrayList<WechatUser> findByList(Page<WechatUser> page, @Param("query") WechatUserQuery query);

    /**
     * 查询所有
     * @param query
     * @param query
     * @return
     */
    ArrayList<WechatUser> findByList(@Param("query") WechatUserQuery query);

    /**
     * 分页查询，返回主要字段
     * @param page
     * @param query
     * @return
     */
    ArrayList<WechatUserSimpleVo> findSimpleByList(Page<WechatUserSimpleVo> page, @Param("query") WechatUserQuery query);

    /**
     * 查询所有会员主要字段
     * @param query
     * @param query
     * @return
     */
//    ArrayList<WechatUserSimpleVo> findSimpleByList(@Param("query") WechatUserQuery query);

    /**
     * 查询最小和最大创建时间
     * @param query
     * @param query
     * @return
    */
    //MinMaxCreateTimeVo findMinAndMaxCreateTime(@Param("query") WechatUserQuery query);

    /**
     * 查询总数
     * @param query
     * @param query
     * @return
     */
    Integer findCount(@Param("query") WechatUserQuery query);

    /**
     * 查询所有用户余额总和
     * @param query
     * @return
     */
    WechatUserTotalVo findTotalBalance(@Param("query") WechatUserQuery query);

    /**
     * 批量删除（真删除)
     * @param list
     * @return
     */
    int batchDelete(List<Long> list);

    /**
     * 修改账号余额
     * @param record
     * @return
     */
    int updateBalance(WechatUser record);

    /**
     * 修改账户信息-合并数据用
     * @param record
     * @return
     */
    int updateByMerge(WechatUser record);

    /**
     * 精准查找微信用户通过用户信息（用户ID、微信昵称、支付宝账号）
     * @param userinfo
     * @return
     */
    WechatUser selectByUserInfo(String userinfo);

    /**
     * 修改定向比例
     * @param record
     * @return
     */
    int updatePriRewardRules(WechatUser record);

    /**
     * 修改备注和标签
     * @param record
     * @return
     */
    int updateRemark(WechatUser record);

    /**
     * 修改备注和标签
     * @param record
     * @return
     */
    int updateRemarkAndTags(WechatUser record);

    /**
     * 修改备注和标签
     * @param record
     * @return
     */
    int updateSysTags(WechatUser record);

    /**
     * 批量修改默认客户端
     * @param updateDefaultClient
     * @return
     */
    int updateDefaultClient(UpdateDefaultClient updateDefaultClient);

    /**
     * 修改单个会员的默认客户端
     * @param updateDefaultClientPersonal
     * @return
     */
    int updateDefaultClientPersonal(UpdateDefaultClientPersonal updateDefaultClientPersonal);

    /**
     * 修改机器人
     * @param record
     * @return
     */
    int updateDevice(WechatUser record);

    /**
     * 修改会员的unionId信息
     * @param record
     * @return
     */
    int updateUzaiUnionId(WechatUser record);

    /**
     * 修改身份信息
     * @param record
     * @return
     */
    int updateIdentityInfo(WechatUser record);

    /**
     * 修改上级树
     * @param record
     * @return
     */
    int updateParetInfo(WechatUser record);

    /**
     * 批量替换上级树
     * @param merId
     * @return
     */
    int batchUpdateParentInfo(@Param("parentInfoOld") String parentInfoOld, @Param("parentInfoNew") String parentInfoNew, @Param("merId") Long merId, @Param("underline") boolean underline);

    /**
     * 查询总数，批量替换上级树
     * @param merId
     * @return
     */
    Integer batchUpdateParentInfoFindCount(@Param("parentInfoOld") String parentInfoOld, @Param("merId") Long merId, @Param("underline") boolean underline);

    /**
     * 分页查询，批量替换上级树
     * @param page
     * @return
     */
    List<WechatUserSimpleVo> batchUpdateParentInfoFindByPage(Page<WechatUserSimpleVo> page, @Param("parentInfoOld") String parentInfoOld, @Param("merId") Long merId, @Param("underline") boolean underline);

    /**
     * 单个修改 批量替换上级树
     * @param queryId
     * @return
     */
    int batchUpdateParentInfoUpdateById(@Param("parentInfoOld") String parentInfoOld, @Param("parentInfoNew") String parentInfoNew, @Param("queryId") Long queryId);

    /**
     * 批量替换代理树
     * @param merId
     * @return
     */
    int batchUpdateAgentInfo(@Param("agentInfoOld") String agentInfoOld, @Param("agentInfoNew") String agentInfoNew, @Param("merId") Long merId, @Param("underline") boolean underline);

    /**
     * 查询总数，批量修改所有下级买家的代理信息 通过买家树匹配
     * @param merId
     * @return
     */
    Integer batchUpdateAgentInfoFindCount(@Param("agentInfoOld") String agentInfoOld,  @Param("merId") Long merId, @Param("underline") boolean underline);

    /**
     * 分页查询，批量修改所有下级买家的代理信息 通过买家树匹配
     * @param page
     * @return
     */
    List<WechatUserSimpleVo> batchUpdateAgentInfoFindByPage(Page<WechatUserSimpleVo> page, @Param("agentInfoOld") String agentInfoOld,  @Param("merId") Long merId, @Param("underline") boolean underline);

    /**
     * 单个修改 批量修改所有下级买家的代理信息 通过买家树匹配
     * @param queryId
     * @return
     */
    int batchUpdateAgentInfoUpdateById(@Param("agentInfoOld") String agentInfoOld, @Param("agentInfoNew") String agentInfoNew, @Param("queryId") Long queryId);

    /**
     * 批量修改所有代理为空的代理信息 通过买家树匹配
     * @param id
     * @return
     */
    int batchUpdateAgentInfoFromParentInfo(@Param("id") Long id, @Param("agentInfo") String agentInfo, @Param("merId") Long merId);

    /**
     * 查询总数，批量修改所有下级买家的代理信息 通过买家树匹配
     * @param id
     * @return
     */
    Integer batchUpdateAgentInfoFromParentInfoFindCount(@Param("id") Long id, @Param("merId") Long merId);

    /**
     * 分页查询，批量修改所有下级买家的代理信息 通过买家树匹配
     * @param page
     * @return
     */
    List<WechatUserSimpleVo> batchUpdateAgentInfoFromParentInfoFindByPage(Page<WechatUserSimpleVo> page, @Param("id") Long id, @Param("merId") Long merId);

    /**
     * 单个修改 批量修改所有下级买家的代理信息 通过买家树匹配
     * @param queryId
     * @return
     */
    int batchUpdateAgentInfoFromParentInfoUpdateById(@Param("id") Long id, @Param("agentInfo") String agentInfo, @Param("queryId") Long queryId);

    /**
     * 批量修改所有合伙人为空的合伙人信息 通过买家树匹配
     * @param id
     * @return
     */
    int batchUpdatePartnerInfoFromParentInfo(@Param("id") Long id, @Param("merId") Long merId);

    /**
     * 批量修改所有合伙人为空的下级会员的合伙人 通过代理树匹配
     * @param id
     * @return
     */
    int batchUpdatePartnerIdFromAgentInfo(@Param("id") Long id, @Param("merId") Long merId);

    /**
     * 修改订阅信息
     * @param record
     * @return
     */
    int updateSubscribeInfo(WechatUser record);

    int updateRiskScoreById(@Param("id") Long id,@Param("merId") Long merId, @Param("riskScore") Integer riskScore);

}